package com.hx.springboot1.controller;

import com.hx.springboot1.pojo.vo.IndexVO;
import com.hx.springboot1.service.impl.UserServiceImpl;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.*;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.ParseException;

@Slf4j
@Controller
public class LoginController {
    @Autowired
    private UserServiceImpl userService;

    @RequestMapping("/loginPage")
    public String loginPage(){ /*登入页面跳转*/
        return "/loginPage";
    }

    @RequestMapping("/login/error")
    public String loginError(Model model, HttpServletRequest req, HttpServletResponse resp){
        resp.setContentType("text/html;charset=utf-8");
        AuthenticationException exception = (AuthenticationException) req.getSession().getAttribute("SPRING_SECURITY_LAST_EXCEPTION");
        if (exception instanceof UsernameNotFoundException){
            model.addAttribute("msg","用户名不存在");
        }else if (exception instanceof InternalAuthenticationServiceException){
            model.addAttribute("msg","您的账户被禁用，请联系管理员！");
        }else if (exception instanceof CredentialsExpiredException){
            model.addAttribute("msg","密码过期");
        }else if (exception instanceof BadCredentialsException){
            model.addAttribute("msg","密码错误");
        }else if (exception instanceof DisabledException){
            model.addAttribute("msg","验证码输入错误！");
        }
        log.info("登入失败原因：{}",model.getAttribute("msg"));
        return "/loginPage";
    }

    @ApiOperation("index页面请求")
    @RequestMapping("/indexRequest")
    @ResponseBody
    public IndexVO indexRequest(Model model, HttpServletRequest req) throws ParseException {
        UserDetails user = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        IndexVO indexVO = userService.userInfo(user.getUsername());
        model.addAttribute("userInfo",indexVO);
        req.getSession().setAttribute("Name",indexVO.getName());
        log.info("用户信息：{}",indexVO);
        return indexVO;
    }

    @RequestMapping("/changeLanguage/{l}")    /* Restful风格传递参数——————————神 */
                /* 使用 Restful风格  可以在GET请求下，传递参数，并且通过 @PathVariable获取到【值】 */
            /* 然后存储到Session域中， 在去 自定义地区解析器，通过Session获取到 这个值， 然后 更改语言！ */
           /*  【问题：】使用了 springSecurity，在重新进入loginPage时，限定了 只能使用POST方法
           * 首先第一步 要对<a>标签 修改语言的跳转url /changeLanguage进行permitAll 开放权限！！
           *  这里使用 restful风格，摒弃 ？传参， 因为在 permitAll时 针对的 url是： /changeLanguage/**  也就是/changeLanguage开头的所有url
             这样一来  可以通过url来获取到 需要的传递的参数！ 即：骗过springSecurity 让他以为我们的get请求 传递的只是一个url 并对这个url permitAll
               然后在 controller 中 接受这个参数  并且存放在session域中， 然后默认 转发 到 登入页loginPage
               接着 加载页面 会在最后加载到我们的 地区解析器 myLocaleResolver 从Session从取值  然后更改语言  渲染显示页面*/
    public String change(HttpServletRequest req,@PathVariable(value = "l") String l){
        req.getSession().setAttribute("lan",l);
        return "loginPage";
    }
}
